package com.ibeeking.found.common.utils;

import com.ibeeking.found.common.constants.GlobalConstant;
import com.ibeeking.nematos.exception.BusinessException;
import com.ibeeking.nematos.utils.data.StringUtils;

import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数字工具类
 */
public class NumberUtils {

    private final static String NUM_PATTERN = "^(\\-|\\+)?\\d+(\\.\\d+)?$";
    public final static String YUAN = "元";

    /**
     * 验证字符串为合法数字字符串
     *
     * @param number
     * @return
     */
    public static boolean isNaN(String number) {
        if (StringUtils.isBlank(number)) {
            return false;
        }
        Pattern pattern = Pattern.compile(NUM_PATTERN);
        Matcher matcher = pattern.matcher(number);
        return matcher.matches();
    }

    /**
     * 数字字符串转换BigDecimal
     *
     * @param decimal
     * @return
     */
    public static BigDecimal string2Decimal(String decimal) {
        if (!isNaN(decimal)) {
            throw new BusinessException("数字格式错误");
        }
        try {
            return new BigDecimal(decimal);
        } catch (Exception e) {
            throw new BusinessException("数字转换失败");
        }
    }

    /**
     * 数字字符串转换BigDecimal 出现异常或不合法返回默认值0
     *
     * @param decimal
     * @return
     */
    public static BigDecimal string2DecimalNullValue2Zero(String decimal) {
        if (!isNaN(decimal)) {
            return BigDecimal.ZERO;
        }
        try {
            return new BigDecimal(decimal);
        } catch (Exception e) {
            e.printStackTrace();
            return BigDecimal.ZERO;
        }
    }

    /**
     * BigDecimal转换字符串，防空指针
     *
     * @param decimal
     * @return 数字字符串 String
     */
    public static String decimal2String(BigDecimal decimal) {
        if (decimal == null) {
            return null;
        }
        return decimal.toString();
    }


    /**
     * 金钱单位转换 分 -> 元
     *
     * @param cent
     * @return 金钱单位：元  数据类型：BigDecimal
     */
    public static BigDecimal cent2Yuan(Long cent) {
        if (cent == null) {
            return null;
        }
        return new BigDecimal(cent).divide(GlobalConstant.ONE_HUNDRED_DECIMAL);

    }

    /**
     * 金钱单位转换 元 -> 分
     *
     * @param yuan
     * @return 金钱单位：分  数据类型：Long
     */
    public static Long yuan2Cent(BigDecimal yuan) {
        if (yuan == null) {
            return null;
        }
        return yuan.multiply(GlobalConstant.ONE_HUNDRED_DECIMAL).longValue();
    }

    /**
     * String转Long , 不合法时返回0
     * @param str
     * @return
     */
    public static Long str2Long(String str){
        try{
            return Long.valueOf(str);
        }catch (Exception e){
            e.printStackTrace();
            return GlobalConstant.ZERO.longValue();
        }
    }

}
